package grupo1.fotomultas.Fotomultas.Infracciones;

import java.util.Calendar;

import Query.*;

import grupo1.fotomultas.Fotomultas.Vehiculo;
import grupo1.fotomultas.Fotomultas.Zona;
import grupo1.fotomultas.Fotomultas.EstadosInfraccion.EstadoInfraccion;
import grupo1.fotomultas.Fotomultas.EstadosInfraccion.InfraccionPendienteDePago;

// COMMENT Por otro lado veo que estan creando un objeto de estos para cada infraccion que se comete.
// Por lo que, están poniendo esta información todo el tiempo, en cada objeto que crean, y esta información
// entonces, podría cambiar de objeto a objeto, lo que hace que deje ser configurable, como decía el enunciado
public class Infraccion implements Pagable, Puntoable, Fechable,Zonable {

	private TipoInfraccion tipoInfraccion;
	private Vehiculo vehiculo;
	private Zona zona;
	private Calendar fecha;
	private EstadoInfraccion estado;
	private boolean puntosPerdonados;
	
	// CORREGIR el tp dice "se puede enviar multiples notificaciones para cada infraccion si el tipo es un Frecuente"
	// es decir, si el vehiculo pertenece a la categori Frecuente, entonces por cada infraccion que cometa, hay que enviar 
	// todas las notificaciones que correnpondan segun el tipo de infraccion
	// entonces, aca deberian tener una coleccion de notificaciones que hay que mandar.
	// Entiendo que quisieron hacer algo asi con el TipoInfraccion pero no me queda del todo clara la implementacion, 
	// principalmente porque hice muchas correcciones en esa clase y se nos fue de las manos :P
	// Lo hablamos en la clase
	public void enviarNotificacion(){
		this.getTipoInfraccion().enviarNotificaciones(this);
		
	}
	
	private void inicializarInfraccion(String nombreID, Zona zona, Calendar fecha) {
		this.tipoInfraccion = HomeTipoInfraccion.instance().buscarTipoInfraccion(nombreID);
		this.setZona(zona);
		HomeInfracciones.Instance().seCreoUnaInfraccion(this);
		this.fecha = fecha;
		this.estado=InfraccionPendienteDePago.instance();
		this.setPuntosPerdonados(false);
	}
	
	public Infraccion( String nombreID, Zona zona, Calendar fecha){
		inicializarInfraccion(nombreID, zona, fecha);
	}


	
	public Infraccion( String nombreID, Zona zona){
		inicializarInfraccion(nombreID, zona, Calendar.getInstance());
	}
	

	public int getCosto() {
		if(this.estasPendienteDePago()) 
			return tipoInfraccion.getCosto();
		return 0;
	}

	public int getPuntos() {
		return tipoInfraccion.getPuntos();
	}

	public void setTipoInfraccion(TipoInfraccion tipoInfraccion) {
		this.tipoInfraccion = tipoInfraccion;
	}

	public TipoInfraccion getTipoInfraccion() {
		return tipoInfraccion;
	}

	public void setVehiculo(Vehiculo vehiculo) {
		this.vehiculo = vehiculo;
	}

	public Vehiculo getVehiculo() {
		return vehiculo;
		
	}

	public String getPatente() {
		return vehiculo.getPatente();
	}

	public String telefonoComisaria() {
		return getZona().getTelefonoComisaria();
	}
	
	// TODO A quien corresponda debera creal este metodo, depende del punto 1.2 1.3 como calcular el costo
	private int totalPagado() {
		return 0;
	}
	
	
	//Methodo que me pide que tengo el Sum
	public Integer getNumberPuntos(){
		return new Integer(this.getPuntos());
	}
	
	public Integer getNumberTotalPagado(){
		
		return new Integer(this.totalPagado());
	}

	public void infraccionPaga() {
		
	}

	public Calendar getFecha() {
		return fecha;
	}

	public void pagar() {
		getEstado().marcarPagada(this);
	}

	public void invalidar() {
		getEstado().marcarInvalidada(this);
	}
	
	public void perdonar() {
		getEstado().marcarPerdonada(this);
	}
	
	public void setEstado(EstadoInfraccion estado) {
		this.estado = estado;
	}

	public EstadoInfraccion getEstado() {
		return estado;
	}

	public boolean estasPendienteDePago() {
		return estado.estasPendienteDePago();
	}

	public void verificarVencimiento() {
		estado.verificarVencimiento(this);
	}

	public void setPuntosPerdonados(boolean puntosPerdonados) {
		this.puntosPerdonados = puntosPerdonados;
	}

	public boolean isPuntosPerdonados() {
		return puntosPerdonados;
	}

	public boolean isTipoInfraccion(TipoInfraccion tipoInfraccion2) {
		return tipoInfraccion.equals(tipoInfraccion2);
	}

	private void setZona(Zona zona) {
		this.zona = zona;
	}

	public Zona getZona() {
		return zona;
	}

}